package fivm.cross.platform.ficommon.distinguish;

import com.google.gson.*;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;

import fivm.cross.platform.ficommon.distinguish.droid.ObjectId;
import fivm.cross.platform.ficommon.distinguish.droid.SerializableStream;

import java.io.IOException;
import java.lang.reflect.Type;


/**
 * Created by Administrator on 2016/5/13.
 */
public class GsonSimpleSerializable extends SerializableStream {
	public String toJson(){
    	 Gson gson=new GsonBuilder()
    	        .excludeFieldsWithoutExposeAnnotation() //不导出实体中没有用@Expose注解的属性  
    	        .enableComplexMapKeySerialization() //支持Map的key为复杂对象的形式  
    	        .serializeNulls()
    	        .setDateFormat("yyyy-MM-dd HH:mm:ss:SSS")//时间转化为特定格式    
    	        .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)//会把字段首字母大写,注:对于实体上使用了@SerializedName注解的不会生效.  
    	        .setPrettyPrinting() //对json结果格式化.  
    	        .setVersion(1.0)    //有的字段不是一开始就有的,会随着版本的升级添加进来,那么在进行序列化和返序列化的时候就会根据版本号来选择是否要序列化.  
    	                            //@Since(版本号)能完美地实现这个功能.还的字段可能,随着版本的升级而删除,那么  
    	                            //@Until(版本号)也能实现这个功能,GsonBuilder.setVersion(double)方法需要调用.
			//.registerTypeAdapter(FiObjectId.class, new ObjectIdTypeAdapter())
    	    .create();

        return gson.toJson(this);
    }
    public String toString(){
        return this.toJson();
    }

    private class ObjectIdTypeAdapter extends TypeAdapter<FiObjectId> {
		@Override
		public void write(final JsonWriter out, final FiObjectId value) throws IOException {
			String valueStr=null;
			if(value!=null){
				valueStr=value.toString();
			}
			out.beginObject()
					.name("$oid")
					.value(valueStr)
					.endObject();
		}
		@Override
		public FiObjectId read(final JsonReader in) throws IOException {
			in.beginObject();
			assert "$oid".equals(in.nextName());
			String objectId = in.nextString();
			in.endObject();
			return new FiObjectId(objectId);
		}
	}



    
}
